Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Semaphor (Informatik)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Semaphor_(Informatik)"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Semaphor_Informatik rootpage-Semaphor_Informatik skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Semaphor (Informatik)</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Ein <b>Semaphor</b> (von <span style="font-style:normal;font-weight:normal"><a href="Altgriechische_Sprache" title="Altgriechische Sprache">altgriechisch</a></span> <span lang="grc-Grek" class="Grek" style="font-style:normal">σῆμα</span> <style data-mw-deduplicate="TemplateStyles:r261937631">
/* start https://de.wikipedia.org/ */


.mw-parser-output .Latn{font-family:"Akzidenz Grotesk","Arial","Avant Garde Gothic","Calibri","Futura","Geneva","Gill Sans","Helvetica","Lucida Grande","Lucida Sans Unicode","Lucida Grande","Stone Sans","Tahoma","Trebuchet","Univers","Verdana"}


/* end https://de.wikipedia.org/ */
</style><span class="Latn" lang="grc-Latn" style="font-weight:normal;font-style:italic"><i>sēma</i></span>, deutsch <span lang="de" style="font-style:normal;font-weight:normal">‚Zeichen‘</span> und <span lang="grc-Grek" class="Grek">φέρειν</span> <i>pherein</i> ‚tragen‘ – also etwa „Signalgeber“) ist eine <a href="Datenstruktur" title="Datenstruktur">Datenstruktur</a>, die aus einer Ganzzahl und den atomaren Nutzungsoperationen „Reservieren/Probieren“ und „Freigeben“ besteht. Sie eignet sich insbesondere zur Verwaltung beschränkter (zählbarer) Ressourcen, auf die mehrere <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozesse</a> oder <a href="Thread_(Informatik)" title="Thread (Informatik)">Threads</a> zugreifen sollen, wie etwa Erzeuger und Verbraucher, sowie zur Koordination asynchroner Abläufe. Im Gegensatz zu einem <a href="Lock" title="Lock">Lock</a> bzw. einem <a href="Mutex" title="Mutex">Mutex</a> müssen die Aktivitätsträger, die „reservieren“ und „freigeben“, nicht identisch sein.
</p>

<div class="mw-heading mw-heading2"><h2 id="Funktionsweise">Funktionsweise</h2></div>
<p>Meist wird die Ganzzahl (Zähler) beim Start des Semaphors mit dem Zahlenwert der maximal verfügbaren Ressourcen initialisiert bzw. der maximalen Zahl der Prozesse, die gleichzeitig die Ressource nutzen können. Ein Prozess, der auf die Ressource zugreifen will, muss vorher die Operation „Reservieren/Probieren“ aufrufen, und danach, wenn er die Ressource nicht mehr benötigt, die Operation „Freigeben“. Bei jeder Reservierung wird der Zähler um 1 heruntergezählt, bei Freigabe wird er wieder um 1 erhöht. Der Zähler darf nicht unter 0 fallen: Wenn eine Reservierung bei Zählerstand 0 erfolgt, wartet der reservierende Prozess, bis ein anderer Prozess Ressourcen freigegeben hat. Es gibt auch Implementierungen, die ins Negative zählen. Damit kann angezeigt werden, wie viele Prozesse auf eine Freigabe warten.
</p><p>Semaphore können bei der <a href="Programmierung" title="Programmierung">Programmierung</a> zur <a href="Prozesssynchronisation" title="Prozesssynchronisation">Prozesssynchronisation</a> eingesetzt werden, also zur Lösung von Aufgaben, bei denen die parallele Ausführung mehrerer <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozesse</a>/<a href="Thread_(Informatik)" title="Thread (Informatik)">Threads</a> eine zeitliche Abstimmung der Ausführungen erfordert. Sie dienen im Allgemeinen dazu, bei einer beschränkten Anzahl von Ressourcen eine Reihenfolge herzustellen, in der viele Threads sich diese knappen Elemente teilen (z.&nbsp;B. Ressource: „CPU-Kern“, Anzahl: 4). Dies kann auch zur Kapselung von Zugriffen auf gemeinsame Daten verwendet werden (Ressource: „Zugriffsrecht auf die Daten“, Anzahl: immer nur einer gleichzeitig). Auch zur Kommunikation zwischen Threads können Semaphore verwendet werden. Sie dienen dann meist als Zähler für verfügbare Informationspakete. Hierbei wird der Semaphor mit „0 Pakete verfügbar“ gestartet, und dann hochgezählt (und wieder bis auf 0 herunter).
</p>
<div class="mw-heading mw-heading2"><h2 id="Namensherkunft">Namensherkunft</h2></div>

<p>Das Wort <i>Semaphor</i> geht auf die <a href="Formsignal" title="Formsignal">Formsignale</a> mechanischer <a href="Eisenbahnsignal" title="Eisenbahnsignal">Eisenbahnsignale</a> zurück.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> Die dort verwendeten <i>Semaphore</i> zeigen an, ob ein <a href="Zug_(Schienenverkehr)" title="Zug (Schienenverkehr)">Zug</a> eine Ressource belegt, also ob ein <a href="Zugfolgeabschnitt" title="Zugfolgeabschnitt">Gleisabschnitt</a> befahren werden darf oder nicht.
</p>
<div class="mw-heading mw-heading2"><h2 id="Wechselwirkungen_parallel_ablaufender_Prozesse">Wechselwirkungen parallel ablaufender Prozesse</h2></div>
<p>Bei der parallelen oder zeitlich verzahnten Ausführung von Prozessen treten implizite oder explizite Wechselwirkungen auf.
</p><p>Bei impliziten Wechselwirkungen ist einem Prozess nicht bewusst, dass durch die Ausführung von Aktionen ein anderer Prozess beeinflusst wird. Dies ist z.&nbsp;B. dann der Fall, wenn ein Prozess einen Systemdienst aufruft, den das Betriebssystem nicht sofort vollständig bearbeiten kann, weil andere Prozesse die erforderlichen Betriebsmittel belegt haben. Der Prozess kann erst dann seine Aktionen weiter fortsetzen, wenn der Systemdienst ausgeführt worden ist. Hier wird die Prozesswechselwirkung als blockierender Funktionsaufruf sichtbar. Spezielle Vorkehrungen gegen eine Blockierung aufgrund impliziter Wechselwirkungen muss und kann ein Prozess nicht treffen.
</p><p>Explizite Wechselwirkungen zwischen Prozessen sind:
</p>
<dl><dt>Konkurrenz</dt>
<dd>Prozesse stehen in Konkurrenz zueinander, wenn sie gleichzeitig auf ein Betriebsmittel (z.&nbsp;B. Speicherstruktur, Verbindung, Gerät) zugreifen, das nur in beschränkter Anzahl zur Verfügung steht und bei dem die Nutzung eines Exemplars nur exklusiv durch einen Prozess möglich ist, da es andernfalls zu fehlerhaften Ergebnissen oder inkonsistenten Zuständen kommt, d.&nbsp;h. wenn es <a href="Kritischer_Abschnitt" title="Kritischer Abschnitt">kritische Abschnitte</a> in den Programmen der Prozesse gibt.</dd>
<dt>Kooperation</dt>
<dd>Prozesse kooperieren, wenn sie ihre Aktionen bewusst aufeinander abstimmen, z.&nbsp;B. weil sie in einer Auftraggeber-/Auftragnehmerbeziehung stehen.</dd></dl>
<p>Sowohl das Reservieren als auch das Freigeben müssen <a href="Atomar" title="Atomar">atomare</a> Operationen sein. Kann eine Reservierung nicht befriedigt werden, so kann sie einfach blockieren (Erlangung der Ressource via <a href="Race_Condition" class="mw-redirect" title="Race Condition">Race Condition</a> unter den Wartenden), der Semaphor eine Warteschlange führen (i. A. blockierend) oder ablehnen (nicht blockierend).
Häufig ist vom Betriebsmittel nur <i>ein</i> Exemplar vorhanden (sog. <a href="Mutex" title="Mutex">wechselseitiger Ausschluss</a>), der Semaphor bewirkt dann eine Abstimmung der zeitlichen Ausführung der Prozessaktionen. Im Fall einer Konkurrenzsituation wird durch eine irgendwie gestaltete Sequentialisierung der Ausführung (der kritischen Abschnitte) erreicht, dass das Betriebsmittel nicht von mehreren Prozessen beliebig verändernd benutzt wird. Im Fall einer Kooperationssituation wird ebenfalls durch eine der Situation entsprechende Sequentialisierung erreicht, dass die Zusammenarbeit der Prozesse gegeben ist (z.&nbsp;B., dass ein Auftragnehmer nicht schon versucht anzufangen etwas zu bearbeiten, obwohl der Auftraggeber noch keinen Auftrag erteilt hat).
</p>
<div class="mw-heading mw-heading2"><h2 id="Lösung_von_Dijkstra"><span id="L.C3.B6sung_von_Dijkstra"></span>Lösung von Dijkstra</h2></div>
<p>Semaphore als Mechanismus für die Prozesssynchronisation wurden von <a href="Edsger_W._Dijkstra" title="Edsger W. Dijkstra">Edsger W. Dijkstra</a> konzipiert und 1965 in seinem Artikel <i>Cooperating sequential processes</i> vorgestellt.
</p><p>Ein Semaphor ist eine Datenstruktur mit einer Initialisierungsoperation und zwei Nutzungsoperationen. Die Datenstruktur besteht aus einem Zähler und einer <a href="Warteschlange_(Datenstruktur)" title="Warteschlange (Datenstruktur)">Warteschlange</a> für die Aufnahme blockierter Prozesse (hier ein Beispiel in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>):
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">semaphor</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">zaehler</span><span class="p">;</span>
<span class="w"> </span><span class="n">Queue</span><span class="w"> </span><span class="o">*</span><span class="n">queue</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Warteschlange */</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="n">Semaphor</span><span class="p">;</span>
</pre></div>
<p>Zähler sowie Warteschlange sind geschützt und können nur über die Semaphoroperationen verändert werden. Die Wirkung der Nutzungsoperation kann wie folgt zusammenfassend beschrieben werden:
</p>
<ul><li>Semaphore regeln Wechselwirkungssituationen von Prozessen durch Zählen</li>
<li>Semaphore realisieren ein passives Warten der Prozesse, wenn eine Weiterausführung nicht gestattet werden kann</li></ul>
<p>Mit der Initialisierungsoperation wird der Zähler auf einen nicht negativen Wert (≥&nbsp;0) und die Warteschlange i.&nbsp;d.&nbsp;R. auf leer gesetzt.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="kt">void</span>
<span class="w"> </span><span class="nf">init</span><span class="p">(</span><span class="n">Semaphor</span><span class="w"> </span><span class="o">*</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">v</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">s</span><span class="o">-&gt;</span><span class="n">zaehler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">v</span><span class="p">;</span>
<span class="w"> </span><span class="n">s</span><span class="o">-&gt;</span><span class="n">queue</span><span class="o">-&gt;</span><span class="n">empty</span><span class="p">(</span><span class="n">s</span><span class="o">-&gt;</span><span class="n">queue</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Wird ein Semaphor zur Organisation von Konkurrenzsituationen eingesetzt, so erfolgt eine Initialisierung mit einem positiven Wert. Ein Semaphor für eine Kooperationssituation wird hingegen mit 0 initialisiert (siehe <a href="#Anwendungsbeispiele">Anwendungsbeispiele</a>).
</p><p>Die Nutzungsoperationen wurden von Dijkstra mit <i>P</i> und <i>V</i> bezeichnet. Dies sind Initialen <a href="Niederl%C3%A4ndische_Sprache" title="Niederländische Sprache">niederländischer</a> Wörter bzw. <a href="Kofferwort" title="Kofferwort">Kofferwörter</a> für <i>prolaag</i> (<i>probeer te verlagen</i> = versuche zu senken) und <i>verhoog</i>.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> Weitere, verbreitete Erklärungen sind <i>passeer</i> (passieren), <i>proberen</i> (überprüfen)<sup id="cite_ref-Silberschatz_S200_3-0" class="reference"><a href="#cite_note-Silberschatz_S200-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> und <i>vrijgeven</i> (freigeben), <i>verhogen</i> (erhöhen).<sup id="cite_ref-Silberschatz_S200_3-1" class="reference"><a href="#cite_note-Silberschatz_S200-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> Programmierschnittstellen verwenden mnemonisch deutlichere Bezeichnungen wie <i>wait</i> (warten), <i>acquire</i> (erlangen) oder <i>down</i> (unten) für die <i>P</i>-Operation und <i>signal</i> (signalisieren), <i>release</i> (freigeben), <i>post</i> (abschicken)<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> oder <i>up</i> (oben) für die <i>V</i>-Operation.
</p><p>Bei einem Aufruf der <i>P</i>-Operation wird der Zähler dekrementiert. Ist der Zähler danach größer gleich 0, so setzt der Prozess seine Aktionen fort. Ist der Zähler jedoch kleiner als 0, kehrt der Kontrollfluss nicht aus der Operation zurück. Der aufrufende Prozess wird blockiert und in die Warteschlange des Semaphors eingereiht. Bei einem Aufruf der <i>V</i>-Operation wird der Zähler inkrementiert. Es wird ein Prozess aus der Warteschlange entnommen und entblockiert, falls die Warteschlange nicht leer ist. Der entblockierte Prozess setzt dann seine Aktionen mit denen fort, die dem <i>P</i>-Aufruf folgen, der den Prozess blockierte. Die hier erläuterte Funktionsweise der Semaphoroperationen erlaubt eine einfache Ermittlung, ob es Prozesse gibt, die am Semaphor blockiert sind: ist der Semaphorzähler kleiner als 0, so gibt es noch blockierte Prozesse. Diese Prozesse riefen die P-Operation auf, als der Zähler bereits kleiner gleich 0 war. Die Überprüfung wird hier zwecks Verdeutlichung der Wirkung der V-Operation auf andere Prozesse explizit notiert. Konkrete Implementierungen können eine Prüfung auf nicht-leere Warteschlange auch in die Warteschlangenmethode verlagern.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cm">/* down() */</span>
<span class="w"> </span><span class="kt">void</span>
<span class="w"> </span><span class="nf">P</span><span class="p">(</span><span class="n">Semaphor</span><span class="w"> </span><span class="o">*</span><span class="n">s</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">s</span><span class="o">-&gt;</span><span class="n">zaehler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="o">-&gt;</span><span class="n">zaehler</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">s</span><span class="o">-&gt;</span><span class="n">zaehler</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="n">selbst_blockieren</span><span class="p">(</span><span class="n">s</span><span class="o">-&gt;</span><span class="n">queue</span><span class="p">);</span><span class="w"> </span><span class="cm">/* Blockieren des Prozesses, Einreihung in Warteschlange */</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cm">/* up() */</span>
<span class="w"> </span><span class="kt">void</span>
<span class="w"> </span><span class="nf">V</span><span class="p">(</span><span class="n">Semaphor</span><span class="w"> </span><span class="o">*</span><span class="n">s</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">s</span><span class="o">-&gt;</span><span class="n">zaehler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="o">-&gt;</span><span class="n">zaehler</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">s</span><span class="o">-&gt;</span><span class="n">zaehler</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="n">einen_entblocken</span><span class="p">(</span><span class="n">s</span><span class="o">-&gt;</span><span class="n">queue</span><span class="p">);</span><span class="w"> </span><span class="cm">/* Entblockieren eines Prozesses aus der Warteschlange */</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Semaphore, deren Zähler aufgrund der Initialisierung und der Verwendung eine "1" als größten positiven Wert annehmen können, werden oftmals auch als binäre Semaphore bzw. Mutex locks bezeichnet.<sup id="cite_ref-Silberschatz_S201_5-0" class="reference"><a href="#cite_note-Silberschatz_S201-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> Semaphore, deren Zähler größere positive Werte als "1" annehmen können, werden zählende Semaphore genannt.
</p><p>Beide Operationen müssen unteilbare, <a href="Atomar#Informatik" title="Atomar">atomare</a> Aktionen sein. Dadurch ist garantiert, dass nach dem Aufruf einer Operation eines Semaphors kein anderer Prozess auf den gleichen Semaphor durch einen Operationsaufruf modifizierend zugreifen kann, bevor die zuerst aufgerufene Semaphoroperation vollständig ausgeführt worden ist. Die Unteilbarkeit ist notwendig, um die Synchronisation zu organisieren und <a href="Race_Condition" class="mw-redirect" title="Race Condition">Wettlaufsituationen</a> bei Ausführung der Semaphoroperationen durch parallele Prozesse zu vermeiden.
</p><p>Die obige Erläuterung der Arbeitsweise ist eine von mehreren möglichen. Diese unterscheiden sich durch die Reihenfolge der Prüfung auf Blockierung/Entblockierung und der Operation Inkrement/Dekrement. In einigen Darstellungen nimmt der Zähler keine negativen Werte an. (Der oben beschriebene Zählerwert ergibt sich, indem man vom Tatsächlichen die Länge der Warteschlange subtrahiert.) In diesem Fall wird die Bezeichnung binärer Semaphor dann offensichtlich.
Die Wirkung der Operationen auf Prozesse ist jedoch unabhängig von der Art der Realisierung. Der obigen Erläuterung wurde wegen einer einfachen Interpretation des Zählers der Vorzug gegeben: Ist der Zähler größer als 0, so gibt sein Wert an, wie viele Prozesse noch ohne Blockierung die P-Operation aufrufen können. Ist der Zähler negativ, so gibt sein Absolutwert an, wie viele Prozesse die P-Operation aufgerufen haben und dabei blockiert wurden.
</p><p>Semaphore beheben den Nachteil des <a href="Aktives_Warten" title="Aktives Warten">aktiven Wartens</a> anderer Synchronisationslösungen wie spezielle Maschinenbefehle oder <a href="Spinlock" title="Spinlock">Spinlocks</a>, da ein Prozess blockiert wird, bis der Blockadegrund entfallen ist. Die Definition lässt offen, welcher blockierte Prozess im Rahmen der Ausführung der <i>V</i>-Operation der Warteschlange entnommen wird. Ein Semaphor, der eine echte Warteschlange nach dem <a href="Windhundprinzip" title="Windhundprinzip">Windhundprinzip</a> (<i>engl. „first come, first served“</i>) garantiert, wird manchmal als starker Semaphor bezeichnet. Ein schwacher Semaphor garantiert hingegen nicht die chronologisch richtige Abarbeitung der Warteschlange. So wird z.&nbsp;B. beim Echtzeitbetrieb das Entblockieren von Prozessen an deren Priorität statt an deren Blockierungszeitpunkt gebunden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Anwendungsbeispiele">Anwendungsbeispiele</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Einsatz_in_Konkurrenzsituationen">Einsatz in Konkurrenzsituationen</h3></div>
<p>In einem <a href="Kritischer_Abschnitt" title="Kritischer Abschnitt">kritischen Abschnitt</a> <i>ka_A</i> verändert Prozess A eine <a href="Datenstruktur" title="Datenstruktur">Datenstruktur</a>, die der <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozess</a> gemeinsam mit einem Prozess B nutzt. Prozess B verändert die Datenstruktur in seinem kritischen Abschnitt <i>ka_B</i>. Ein <a href="Mutex" title="Mutex">Semaphor in Ausschlussfunktion</a> wird eingesetzt, um zu erreichen, dass sich die Prozesse A und B niemals gleichzeitig in ihren kritischen Abschnitten befinden. Hierzu wird der Semaphor mit 1 initialisiert, es wird also ein binärer Semaphor eingesetzt:
</p>
<pre>Gemeinsam von A und B genutzter Semaphor: mutex
Initialisierung: init (mutex, 1) /* Es gibt 1 Ressourcen-Exemplar "Recht auf Betreten eines kritischen Abschnitts" */
</pre>
<pre>Prozess A Prozess B
... ...
P (mutex) P (mutex) /* versuche "Betreten-Recht" zu reservieren (blockierend) */
ka_A ka_B
V (mutex) V (mutex) /* freigeben des "Betreten-Rechts" */
... ...
</pre>
<p>Benötigen <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozesse</a> jeweils exklusiv ein <a href="Betriebsmittel_(Informatik)" title="Betriebsmittel (Informatik)">Betriebsmittel</a>, das nur in beschränkter Anzahl zur Verfügung steht, so wird mittels eines zählenden Semaphors erreicht, dass ein Prozess dann blockiert wird, wenn alle Betriebsmittel in Benutzung sind. Der Semaphor wird mit der Anzahl verfügbarer Betriebsmittel initialisiert:
</p>
<pre>Semaphor zur Betriebsmittelverwaltung: s_available
Initialisierung: init (s_available, n)
</pre>
<pre>Prozess
...
P (s_available) /* Anzeige des Nutzungswunschs; warte bis "für mich reserviert wurde" */
... /* Nutzung des Betriebsmittels */
V (s_available) /* Anzeige des Nutzungsabschlusses, freigeben */
...
</pre>
<div class="mw-heading mw-heading3"><h3 id="Einsatz_in_Kooperationssituationen">Einsatz in Kooperationssituationen</h3></div>
<p><a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozess</a> A enthält einen Programmabschnitt <i>C_I</i>, in dem eine Datenstruktur initialisiert wird, die dann von Prozess B in einem Programmabschnitt <i>C_V</i> verarbeitet wird. Offensichtlich muss <i>C_I</i> unter allen Umständen vor <i>C_V</i> ausgeführt werden. Es wird ein Semaphor in Signalisierungsfunktion eingesetzt:
</p>
<pre>Gemeinsam von A und B genutzter Semaphor: s_inform
Initialisierung: init (s_inform, 0)
</pre>
<pre>Prozess A Prozess B
... ...
C_I P (s_inform)
V (s_inform) C_V
... ...
</pre>
<p>Prozess B versucht zu reservieren und muss warten, bis Prozess A mittels Freigabe <i>s_inform</i> auf 1 (Datensatz verfügbar) hochgezählt hat.
</p>
<div class="mw-heading mw-heading3"><h3 id="Passing_the_Baton_Pattern">Passing the Baton Pattern</h3></div>
<p>Das von Gregory R. Andrews vorgeschlagene <i>Passing the Baton Pattern</i><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> (deutsch: <i>Staffelstab-Algorithmus</i><sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>) ist ein <a href="Entwurfsmuster" title="Entwurfsmuster">allgemeines Schema</a> zur Lösung vieler <a href="Generische_Programmierung" title="Generische Programmierung">generischer</a> Programmierprobleme, bei denen mehrere <a href="Nebenl%C3%A4ufigkeit" title="Nebenläufigkeit">nebenläufige</a> <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozesse</a> um dieselbe Ressource mit komplexen Bedingungssynchronisationen konkurrieren, z.&nbsp;B. Erfüllung bestimmter Prioritätskriterien oder Vermeidung von <a href="Verhungern_(Informatik)" title="Verhungern (Informatik)">Verhungern</a>. Bei einer gemeinsam genutzten Ressource erfordert das Pattern eine private Semaphore <i>priv</i> (initialisiert auf 0) für jeden beteiligten Prozess oder jede Klasse von Prozessen und eine einzige Semaphore <i>mutex</i> für den gegenseitigen Ausschluss (initialisiert auf 1).
</p><p>Der <a href="Pseudocode" title="Pseudocode">Pseudocode</a> für jeden Prozess lautet:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">Prozess</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">res_id</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">Ressource_Erwerben</span><span class="p">(</span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="n">res_id</span><span class="p">);</span>

<span class="w"> </span><span class="o">&lt;</span><span class="n">Die</span><span class="w"> </span><span class="n">Ressource</span><span class="w"> </span><span class="n">res_id</span><span class="w"> </span><span class="n">benutzen</span><span class="o">&gt;</span><span class="p">;</span>

<span class="w"> </span><span class="n">Ressource_Freigeben</span><span class="p">(</span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="n">res_id</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
<p>Die <a href="Funktion_(Informatik)" class="mw-redirect" title="Funktion (Informatik)">Funktionen</a> für das Erwerben und Freigeben der Ressource sind wie folgt aufgebaut:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">Ressource_Erwerben</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">res_id</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">P</span><span class="p">(</span><span class="n">mutex</span><span class="p">);</span>

<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">&lt;</span><span class="n">die</span><span class="w"> </span><span class="n">Bedingung</span><span class="w"> </span><span class="n">für</span><span class="w"> </span><span class="n">den</span><span class="w"> </span><span class="n">Zugriff</span><span class="w"> </span><span class="n">auf</span><span class="w"> </span><span class="n">res_id</span><span class="w"> </span><span class="n">ist</span><span class="w"> </span><span class="n">nicht</span><span class="w"> </span><span class="n">erfüllt</span><span class="w"> </span><span class="n">für</span><span class="w"> </span><span class="n">proc_id</span><span class="o">&gt;</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="o">&lt;</span><span class="n">erfassen</span><span class="p">,</span><span class="w"> </span><span class="n">dass</span><span class="w"> </span><span class="n">proc_id</span><span class="w"> </span><span class="n">für</span><span class="w"> </span><span class="n">res_id</span><span class="w"> </span><span class="n">blockiert</span><span class="w"> </span><span class="n">ist</span><span class="o">&gt;</span><span class="p">;</span>
<span class="w"> </span><span class="n">V</span><span class="p">(</span><span class="n">mutex</span><span class="p">);</span>
<span class="w"> </span><span class="n">P</span><span class="p">(</span><span class="n">priv</span><span class="p">[</span><span class="n">proc_id</span><span class="p">]);</span>
<span class="w"> </span><span class="o">&lt;</span><span class="n">erfassen</span><span class="p">,</span><span class="w"> </span><span class="n">dass</span><span class="w"> </span><span class="n">proc_id</span><span class="w"> </span><span class="n">für</span><span class="w"> </span><span class="n">res_id</span><span class="w"> </span><span class="n">nicht</span><span class="w"> </span><span class="n">mehr</span><span class="w"> </span><span class="n">blockiert</span><span class="w"> </span><span class="n">ist</span><span class="o">&gt;</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="o">&lt;</span><span class="n">erfassen</span><span class="p">,</span><span class="w"> </span><span class="n">dass</span><span class="w"> </span><span class="n">proc_id</span><span class="w"> </span><span class="n">auf</span><span class="w"> </span><span class="n">res_id</span><span class="w"> </span><span class="n">zugreift</span><span class="o">&gt;</span><span class="p">;</span>

<span class="w"> </span><span class="n">Staffelstab_Weitergeben</span><span class="p">(</span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="n">res_id</span><span class="p">);</span><span class="w"> </span><span class="c1">// siehe unten</span>
<span class="p">}</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">Ressource_Freigeben</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">res_id</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">P</span><span class="p">(</span><span class="n">mutex</span><span class="p">);</span>

<span class="w"> </span><span class="o">&lt;</span><span class="n">erfassen</span><span class="p">,</span><span class="w"> </span><span class="n">dass</span><span class="w"> </span><span class="n">proc_id</span><span class="w"> </span><span class="n">auf</span><span class="w"> </span><span class="n">res_id</span><span class="w"> </span><span class="n">nicht</span><span class="w"> </span><span class="n">mehr</span><span class="w"> </span><span class="n">zugreift</span><span class="o">&gt;</span><span class="p">;</span>

<span class="w"> </span><span class="n">Staffelstab_Weitergeben</span><span class="p">(</span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="n">res_id</span><span class="p">);</span><span class="w"> </span><span class="c1">// siehe unten</span>
<span class="p">}</span>
</pre></div><p>Beide <a href="Operation_(Informatik)" title="Operation (Informatik)">Operationen</a> verwenden die <a href="Funktion_(Informatik)" class="mw-redirect" title="Funktion (Informatik)">Funktion</a> <i>Staffelstab_Weitergeben</i>:</p><div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">Staffelstab_Weitergeben</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">proc_id</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">res_id</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">&lt;</span><span class="n">die</span><span class="w"> </span><span class="n">Bedingung</span><span class="w"> </span><span class="n">für</span><span class="w"> </span><span class="n">den</span><span class="w"> </span><span class="n">Zugriff</span><span class="w"> </span><span class="n">auf</span><span class="w"> </span><span class="n">res_id</span><span class="w"> </span><span class="n">ist</span><span class="w"> </span><span class="n">von</span><span class="w"> </span><span class="n">mindestens</span><span class="w"> </span><span class="n">einem</span><span class="w"> </span><span class="n">blockierten</span><span class="w"> </span><span class="n">Prozess</span><span class="w"> </span><span class="n">erfüllt</span><span class="o">&gt;</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&lt;</span><span class="n">Wahl</span><span class="w"> </span><span class="n">eines</span><span class="w"> </span><span class="n">blockierten</span><span class="w"> </span><span class="n">Prozesses</span><span class="w"> </span><span class="n">um</span><span class="w"> </span><span class="n">ihn</span><span class="w"> </span><span class="n">zu</span><span class="w"> </span><span class="n">reaktivieren</span><span class="o">&gt;</span><span class="p">;</span>
<span class="w"> </span><span class="n">V</span><span class="p">(</span><span class="n">priv</span><span class="p">[</span><span class="n">p</span><span class="p">]);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">V</span><span class="p">(</span><span class="n">mutex</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p><b>Anmerkungen:</b>
</p><p>Das Pattern wird <i>Passing the Baton</i> genannt, weil ein <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozess</a>, der die Ressource freigibt, sowie ein frisch reaktivierter Prozess höchstens einen anderen angehaltenen Prozess aktiviert, d. h. sozusagen "den Staffelstab an ihn weitergibt". Die <i>mutex</i> Semaphore wird nur dann freigegeben, wenn ein Prozess sich selbst blockiert (während der <a href="Funktion_(Informatik)" class="mw-redirect" title="Funktion (Informatik)">Funktion</a> <i>Ressource_Erwerben</i>) oder wenn es innerhalb der <a href="Operation_(Informatik)" title="Operation (Informatik)">Operation</a> <i>Staffelstab_Weitergeben</i> nicht möglich ist, einen anderen blockierten Prozess zu reaktivieren.
</p>
<div class="mw-heading mw-heading2"><h2 id="Implementierung">Implementierung</h2></div>
<p>Eine Implementierung der Semaphormechanismen ist konzeptionell im Betriebssystem anzusiedeln, da sie eng mit der Prozessverwaltung zusammenarbeiten muss. Eine Realisierung der Unteilbarkeit auf Monoprozessorsystemen kann dann z.&nbsp;B. mittels <a href="Interrupt" title="Interrupt">Unterbrechungssperre</a> erfolgen. Im Fall von Multiprozessorsystemen ist eine Klammerung der Anweisungsfolgen der Semaphoroperationen durch <a href="Spinlock" title="Spinlock">Spinlocks</a> erforderlich. Eine Realisierung durch das Betriebssystem ermöglicht ferner, dass mehrere Prozesse mit ihren eigentlich <a href="Disjunkt" title="Disjunkt">disjunkten</a> <a href="Adressraum" title="Adressraum">Adressräumen</a> einen Semaphor gemeinsam nutzen können.
</p><p>Werden Semaphore von einem Thread-Paket, das im Benutzeradressraum läuft (User-Level-Threads), angeboten, so gestaltet sich die Realisierung der Unteilbarkeit aufwändiger. Sie muss beliebige Unterbrechungen berücksichtigen und hängt davon ab, welche Informationen über User-Level-Threads im Kern vorliegen.
</p>
<div class="mw-heading mw-heading2"><h2 id="Verwandte_Themen">Verwandte Themen</h2></div>
<ul><li><a href="Mutex" title="Mutex">Mutex</a> – Oberbegriff für Verfahren, die wechselseitigen Ausschluss von Datenzugriffen ermöglichen.</li>
<li><a href="Monitor_(Informatik)" title="Monitor (Informatik)">Monitor</a> – ein programmiersprachliches Konzept zur Prozesssynchronisation.</li>
<li><a href="Jacketing" title="Jacketing">Jacketing</a> – die Möglichkeit, einen blockierenden Systemaufruf zu umgehen.</li>
<li><a href="Bolt-Variable" title="Bolt-Variable">Bolt-Variable</a> – Variante des Semaphors zur flexibleren Realisierung eines <a href="Read-Write-Lock" class="mw-redirect" title="Read-Write-Lock">Read-Write-Lock</a>.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Andrew S. Tanenbaum: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Moderne Betriebssysteme</cite> (=&nbsp;<cite class="lang" lang="en" dir="auto" style="font-style:italic">Pearson Studium – IT</cite>). Dritte aktualisierte Auflage. Addison-Wesley Verlag, 2009, ISBN 978-3-8273-7342-7, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>1248</span> (englisch, Originaltitel: <cite style="font-style:italic">Modern Operating Systems</cite>.).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.au=Andrew+S.+Tanenbaum&amp;rft.btitle=Moderne+Betriebssysteme&amp;rft.date=2009&amp;rft.edition=Dritte+aktualisierte&amp;rft.genre=book&amp;rft.isbn=9783827373427&amp;rft.pages=1248&amp;rft.pub=Addison-Wesley+Verlag&amp;rft.series=Pearson+Studium+-+IT" style="display:none">&nbsp;</span></li>
<li>James H. Anderson, Yong-Jik Kim, Ted Herman: <cite style="font-style:italic">Shared-memory mutual exclusion: major research trends since 1986</cite>. In: <cite style="font-style:italic">Distrib. Comput.</cite> <span style="white-space:nowrap">Band<span style="display:inline-block;width:.2em">&nbsp;</span>16</span>, <span style="white-space:nowrap">Nr.<span style="display:inline-block;width:.2em">&nbsp;</span>2–3</span>. Springer-Verlag, September 2003, <a href="Internationale_Standardnummer_f%C3%BCr_fortlaufende_Sammelwerke" title="Internationale Standardnummer für fortlaufende Sammelwerke">ISSN</a>&nbsp;<span style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://zdb-katalog.de/list.xhtml?t=iss%3D%220178-2770%22&amp;key=cql">0178-2770</a></span>, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>75–110</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/s00446-003-0088-6">10.1007/s00446-003-0088-6</a></span>.<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.atitle=Shared-memory+mutual+exclusion%3A+major+research+trends+since+1986&amp;rft.au=James+H.+Anderson%2C+Yong-Jik+Kim%2C+Ted+Herman&amp;rft.date=2003-09&amp;rft.doi=10.1007%2Fs00446-003-0088-6&amp;rft.genre=journal&amp;rft.issn=0178-2770&amp;rft.issue=2-3&amp;rft.jtitle=Distrib.+Comput.&amp;rft.pages=75-110&amp;rft.place=London+UK&amp;rft.pub=Springer-Verlag&amp;rft.volume=16" style="display:none">&nbsp;</span></li>
<li>M. Raynal, D. Beeson: <cite style="font-style:italic">Algorithms for mutual exclusion</cite>. MIT Press, Cambridge MA 1986, ISBN 0-262-18119-3.<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.au=M.+Raynal%2C+D.+Beeson&amp;rft.btitle=Algorithms+for+mutual+exclusion&amp;rft.date=1986&amp;rft.genre=book&amp;rft.isbn=0262181193&amp;rft.place=Cambridge+MA&amp;rft.pub=MIT+Press" style="display:none">&nbsp;</span></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://bxr.su/FreeBSD/sys/kern/kern_sema.c#28">Implementierung von Semaphoren in FreeBSD, Kernel</a></li>
<li><a rel="nofollow" class="external text" href="http://bxr.su/FreeBSD/lib/libc/gen/sem_new.c#51">Implementierung von Semaphoren in FreeBSD, API</a></li>
<li><a rel="nofollow" class="external text" href="http://bxr.su/FreeBSD/include/semaphore.h#30">Schnittstellenspezifikation bzw. API über Semaphoren in FreeBSD</a></li>
<li><a rel="nofollow" class="external text" href="https://www.freebsd.org/cgi/man.cgi?query=sem_init&amp;sektion=3&amp;manpath=FreeBSD+10.2-RELEASE">sem_init(3)</a></li>
<li><a rel="nofollow" class="external text" href="https://www.freebsd.org/cgi/man.cgi?query=sem_post&amp;sektion=3&amp;manpath=FreeBSD+10.2-RELEASE">sem_post(3)</a></li>
<li><a rel="nofollow" class="external text" href="https://www.freebsd.org/cgi/man.cgi?query=sem_trywait&amp;sektion=3&amp;manpath=FreeBSD+10.2-RELEASE">sem_wait(3)</a></li>
<li><a rel="nofollow" class="external text" href="https://www.freebsd.org/cgi/man.cgi?query=sem_getvalue&amp;sektion=3&amp;manpath=FreeBSD+10.2-RELEASE">sem_getvalue(3)</a></li>
<li><a rel="nofollow" class="external text" href="https://www.freebsd.org/cgi/man.cgi?query=sem_destroy&amp;sektion=3&amp;manpath=FreeBSD+10.2-RELEASE">sem_destroy(3)</a></li>
<li><a rel="nofollow" class="external text" href="https://www.freebsd.org/cgi/man.cgi?query=sem&amp;manpath=FreeBSD+10.2-RELEASE">sem(4)</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://tldp.org/LDP/lpg/node47.html"><i>Semaphores: Basic Concepts</i>.</a> In: <i>The Linux Programmer’s Guide</i></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.cs.utexas.edu/users/EWD/transcriptions/EWD00xx/EWD74.html">cs.utexas.edu</a> E. W. Dijkstra Archive (niederländisch)</span>
</li>
<li id="cite_note-Silberschatz_S200-3"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-Silberschatz_S200_3-0">a</a></sup> <sup><a href="#cite_ref-Silberschatz_S200_3-1">b</a></sup></span> <span class="reference-text">Abraham Silberschatz, Peter B. Galvin, Greg Gagne: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Operating system concepts</cite>. 7. Auflage. John Wiley &amp; Sons, Hoboken NJ 2005, ISBN 0-471-69466-5, 6.5 Semaphores, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>200</span> (englisch).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abookitem&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.atitle=6.5+Semaphores&amp;rft.au=Abraham+Silberschatz%2C+Peter+B.+Galvin%2C+Greg+Gagne&amp;rft.btitle=Operating+system+concepts&amp;rft.date=2005&amp;rft.edition=7&amp;rft.genre=bookitem&amp;rft.isbn=0471694665&amp;rft.pages=200&amp;rft.place=Hoboken+NJ&amp;rft.pub=John+Wiley+%26+Sons" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/7908799/xsh/sem_post.html">pubs.opengroup.org</a></span>
</li>
<li id="cite_note-Silberschatz_S201-5"><span class="mw-cite-backlink"><a href="#cite_ref-Silberschatz_S201_5-0">↑</a></span> <span class="reference-text">Abraham Silberschatz, Peter B. Galvin, Greg Gagne: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Operating system concepts</cite>. 7. Auflage. John Wiley &amp; Sons, Hoboken NJ 2005, ISBN 0-471-69466-5, 6.5 Semaphores, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>201</span> (englisch).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abookitem&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.atitle=6.5+Semaphores&amp;rft.au=Abraham+Silberschatz%2C+Peter+B.+Galvin%2C+Greg+Gagne&amp;rft.btitle=Operating+system+concepts&amp;rft.date=2005&amp;rft.edition=7&amp;rft.genre=bookitem&amp;rft.isbn=0471694665&amp;rft.pages=201&amp;rft.place=Hoboken+NJ&amp;rft.pub=John+Wiley+%26+Sons" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text"><span class="book">Gregory R. Andrews: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Foundations of Multithreaded, Parallel, and Distributed Programming</cite>. Addison-Wesley, 1999 (englisch).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.au=Gregory+R.%26%2332%3BAndrews&amp;rft.btitle=Foundations+of+Multithreaded%2C+Parallel%2C+and+Distributed+Programming&amp;rft.date=1999&amp;rft.genre=book&amp;rft.pub=Addison-Wesley" style="display:none">&nbsp;</span></span></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a></span> <span class="reference-text"><span class="book">Richard H. Carver, Kuo-Chung Thai: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Modern Multithreading: Implementing, Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32 Programs</cite>. Wiley, 2005 (englisch).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.au=Richard+H.%26%2332%3BCarver%2C%26%2332%3BKuo-Chung%26%2332%3BThai&amp;rft.btitle=Modern+Multithreading%3A+Implementing%2C+Testing%2C+and+Debugging+Multithreaded+Java+and+C%2B%2B%2FPthreads%2FWin32+Programs&amp;rft.date=2005&amp;rft.genre=book&amp;rft.pub=Wiley" style="display:none">&nbsp;</span></span></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external free" href="https://greenteapress.com/wp/semaphores/">https://greenteapress.com/wp/semaphores/</a></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><a href="#cite_ref-9">↑</a></span> <span class="reference-text"><span class="book">Christian Maurer: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Nonsequential and Distributed Programming with Go</cite>. Springer, 2021 (englisch).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Semaphor+%28Informatik%29&amp;rft.au=Christian%26%2332%3BMaurer&amp;rft.btitle=Nonsequential+and+Distributed+Programming+with+Go&amp;rft.date=2021&amp;rft.genre=book&amp;rft.pub=Springer" style="display:none">&nbsp;</span></span></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-12-15" href="https://de.wikipedia.org/wiki/?title=Semaphor_(Informatik)&amp;oldid=262442746">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>